package controller;

import view.IHM;
import model.Engine;
import commands.Command;

/**
 * Interface pour la partie controleur du metronome. Il s'agit de proposer un objet permettant de decoupler l'IHM du moteur, ce qui est fait ici. On retrouve donc 
 * les interactions offertes par le metronome. Le traitement de ces interactions est effectue par delegation par le moteur. Aussi certaines methodes permettent de 
 * maintenir la coherence de l'IHM lorsque l'etat du moteur a change.
 */
public interface Controller {
	
	/**
	 * Change les commandes associees aux boutons.
	 * @param buttonsCommands	Les nouvelles commandes associees aux boutons
	 */
	public void setButtonsCommands(Command[] buttonsCommands);
	
	/**
	 * Change les commandes associees a l'afficheur.
	 * @param displayerCommands	Les nouvelles commandes associees a l'afficheur
	 */
	public void setDisplayerCommands(Command[] displayerCommands);
	
	/**
	 * Change le moteur associe au controleur.
	 * @param engine	Le nouveau moteur
	 */
	public void setEngine(Engine engine);
	
	/**
	 * Change l'IHM associee au controleur.
	 * @param ihm	La nouvelle IHM
	 */
	public void setIHM(IHM ihm);
	
	/**
	 * Modifie l'etat du moteur, en fonction du bouton presse.
	 * @param buttonID	Numero du bouton presse
	 */
	public void buttonPressed(int buttonID);
	
	/**
	 * Modifie le tempo du moteur, en fonction de la nouvelle position de la molette.
	 * @param wheelPosition	La nouvelle position de la molette
	 * 
	 */
	public void wheelPositionChanged(float wheelPosition);
	
	/**
	 * Met a jour l'afficheur du tempo en cas de changement.
	 * @param tempo Le nouveau tempo a afficher
	 */
	public void tempoChanged(int tempo);
	
	/**
	 * Marque le temps.
	 */
	public void beatTime();

	/**
	 * Marque la mesure.
	 */
	public void beatBar();
	
	/**
	 * Desactive la possibilite de demarrer le metronome au niveau de l'IHM.
	 */
	public void disableStart();
	
	/**
	 * Desactive la possibilite d'arreter le metronome au niveau de l'IHM.
	 */
	public void disableStop();
	
	/**
	 * Active la possibilite de demarrer le metronome au niveau de l'IHM.
	 */
	public void enableStart();
	
	/**
	 * Active la possibilite d'arreter le metronome au niveau de l'IHM.
	 */
	public void enableStop();
	
	/**
	 * Desactive la possibilite d'augmenter le nombre de temps par mesure au niveau de l'IHM.
	 */
	public void disableTimesPerBarInc();
	
	/**
	 * Desactive la possibilite de diminuer le nombre de temps par mesure au niveau de l'IHM.
	 */
	public void disableTimesPerBarDec();
	
	/**
	 * Active la possibilite d'augmenter le nombre de temps par mesure au niveau de l'IHM.
	 */
	public void enableTimesPerBarInc();
	
	/**
	 * Active la possibilite de diminuer le nombre de temps par mesure au niveau de l'IHM.
	 */
	public void enableTimesPerBarDec();

}
